package com.sywl.ytcx.service;

import com.sywl.ytcx.config.OrderExcelDTO;
import com.sywl.ytcx.entity.order.Order;
import com.sywl.ytcx.entity.res.ResponseResult;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单列表服务接口
 * 定义了订单管理相关的核心业务操作方法
 */
public interface OrderListService {

    /**
     * 获取"待付款"状态的订单列表
     * @return List<Order> 待付款订单列表
     */
    List<Order> listPendingPayment();

    /**
     * 获取"已付款"状态的订单列表
     * @return List<Order> 已付款订单列表
     */
    List<Order> listPaid();

    /**
     * 获取"待出稿"状态的订单列表
     * @return List<Order> 待出稿订单列表
     */
    List<Order> listUnpublished();

    /**
     * 获取"已出稿"状态的订单列表
     * @return List<Order> 已出稿订单列表
     */
    List<Order> listPublished();

    /**
     * 根据用户ID筛选订单列表
     * @param userId 用户唯一标识符
     * @return List<Order> 指定用户的订单列表
     */
    ResponseResult listByUserId(int userId);



    /**
     * 根据订单号查询单个订单
     * @param orderNumber 订单编号
     * @return ResponseResult 包含查询结果的响应对象
     */
    ResponseResult getByOrderNumber(String orderNumber);

    /**
     * 根据订单ID查询单个订单
     * @param orderId 订单唯一标识符
     * @return ResponseResult 包含查询结果的响应对象
     */
    ResponseResult getById(Long orderId);

    /**
     * 获取所有订单的导出数据列表
     * 用于将所有订单信息导出到Excel文件
     * @return List<OrderExcelDTO> 订单导出数据列表
     */
    List<OrderExcelDTO> getAllForExport();

    /**
     * 根据用户ID获取指定用户的订单导出数据列表
     * 用于将特定用户的订单信息导出到Excel文件
     * @param userId 用户唯一标识符
     * @return List<OrderExcelDTO> 指定用户的订单导出数据列表
     */
    List<OrderExcelDTO> getByUserForExport(Integer userId);


    /** 按用户账号查询订单 */
    ResponseResult listOrdersByAccount(String account);



    /**
     * 根据用户ID获取订单列表
     * @param userId 用户ID
     * @return 统一响应结果，包含订单列表数据
     */
    ResponseResult getOrdersByUserId(int userId);



    /**
     * 获取用户订单（按日期排序）
     * @param userId 用户ID
     * @return 统一响应结果
     */
    ResponseResult getOrdersByDate(int userId);

    /**
     * 获取用户未付款订单
     * @param userId 用户ID
     * @return 统一响应结果
     */
    ResponseResult getUnpaidOrders(int userId);

    /**
     * 获取用户已付款订单
     * @param userId 用户ID
     * @return 统一响应结果
     */
    ResponseResult getPaidOrders(int userId);


    /**
     * 按创建时间排序获取所有订单
     * @param sortOrder 排序顺序："asc" 或 "desc"
     */
    ResponseResult listAllByCreatedAt(String sortOrder);

    /**
     * 按订单金额排序获取所有订单
     * @param sortOrder 排序顺序："asc" 或 "desc"
     */
    ResponseResult listAllByTotalAmount(String sortOrder);


    /**
     * 统计今日收入，返回 ResponseResult
     */
    ResponseResult getDailyIncome();

    /**
     * 统计本月收入，返回 ResponseResult
     */
    ResponseResult getMonthlyIncome();

    /**
     * @param dateStart 支持 yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss
     * @param dateEnd   支持 yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss
     */
    ResponseResult listByDateRange(String dateStart, String dateEnd);


    /**
     * 统计今日收入（指定用户）
     */
    ResponseResult getUserDailyIncome(int userId);

    /**
     * 统计本月收入（指定用户）
     */
    ResponseResult getUserMonthlyIncome(int userId);


    /**
     * 查询所有退款（status = 'cancelled'）的订单列表
     * @return ResponseResult 包含退款订单列表
     */
    ResponseResult getCancelledOrders();

    /**
     * 按日期范围查询退款订单列表
     * 支持 dateStart / dateEnd 格式：yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss
     * @param dateStart 起始日期字符串
     * @param dateEnd   结束日期字符串
     * @return ResponseResult 包含指定时间段内的退款订单列表
     */
    ResponseResult getCancelledOrdersByDate(String dateStart, String dateEnd);


    /**
     * 查询指定用户的所有退款订单列表
     * @param userId 用户ID
     * @return ResponseResult 封装了指定用户所有退款订单列表
     */
    ResponseResult getUserCancelledOrders(int userId);


    /**
     * 按日期范围查询指定用户的退款订单列表
     * 支持 dateStart / dateEnd 格式：yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss
     * @param userId   用户ID
     * @param dateStart 起始日期字符串
     * @param dateEnd   结束日期字符串
     * @return ResponseResult 封装了指定用户指定时间段内的退款订单列表
     */
    ResponseResult getUserCancelledOrdersByDate(int userId, String dateStart, String dateEnd);


    /**
     * 获取每篇帖子的转化率列表。
     * @return ResponseResult.data 为 List<PostViewOrderRateVO>
     */
    ResponseResult getPostViewOrderRates();

    /**
     * 获取全站浏览-下单整体转化率。
     * @return ResponseResult.data 为 OverallViewOrderRateVO
     */
    ResponseResult getOverallViewOrderRate();


    /**
     * 查询指定用户发帖的浏览→下单转化率
     * @param userId 发帖用户 ID
     * @return ResponseResult.data 为 UserPostViewOrderRateVO
     */
    ResponseResult getUserPostViewOrderRate(int userId);

}
